/**
 * 
 */
package gmu.drr.runSynthSimple;

import java.util.Properties;

import cern.jet.random.*;
import cern.jet.random.engine.*;
import gmu.drr.entity.*;
import gmu.drr.entity.netFactory.ModelFactory;

/**
 * @author rothmd01
 *
 */
public class SynthSimpleParameters {
	private static Properties knownDefaults = null;
	
	public static Properties getDefault() {
		if( knownDefaults != null ) return knownDefaults;
		
		Properties propsDefault = new Properties() ;
		
		propsDefault.put( "ModelName", "Default Model Name Parameter");
		propsDefault.put( "Model", "gmu.drr.modelInst.simple.ModelSimple" );
		propsDefault.put( "ModelFactory", "gmu.drr.modelInst.simple.ModelFactorySimple" );
		propsDefault.put( "FactoryRandomEngine", "cern.jet.random.engine.MersenneTwister" );
		int factRandSeed = (new cern.jet.random.engine.RandomSeedGenerator() ).nextSeed();
		propsDefault.put( "FactoryRandomSeed", (new Integer(factRandSeed)).toString() );
		propsDefault.put( "NumberUsers", (new Integer(400)).toString());
		propsDefault.put( "NumberUserGroups", (new Integer(8)).toString());
		propsDefault.put( "NumberDocs", (new Integer(400)).toString());
		propsDefault.put( "NumberDocGroups", (new Integer(8)).toString());
		// DocGroupRel (relationship between documents and docGroups
		propsDefault.put( "DocGroupRel", "gmu.drr.modelInst.simple.DocGroupRelSimple" );
		// in the simple model case, each doc-docGroup relationship has a weight [0..1], Beta distributed
		propsDefault.put( "DocGroupRelWeightDist", "cern.jet.random.Beta" );
		// the A parameter of the Beta distribution
		propsDefault.put( "DocGroupRelWeightParA", (new Double(2)).toString() );
		// the B parameter of the Beta distribution
		propsDefault.put( "DocGroupRelWeightParB", (new Double(8)).toString() );
		propsDefault.put( "UserDegree", "cern.jet.random.Exponential" );
		propsDefault.put( "UserDegreeWeight", (new Double(1.0/20.0)).toString() );
		propsDefault.put( "NetEdgeWeight", "gmu.drr.modelInst.simple.NetEdgeWeightSimple" );
		// for the simple model case, each edge has a single weight [0..1], Poisson distributed 
		propsDefault.put( "NetEdgeWeightDist", "cern.jet.random.Beta" );
		propsDefault.put( "NetEdgeWeightParA", (new Double(2)).toString() );
		propsDefault.put( "NetEdgeWeightParB", (new Double(8)).toString() );
		propsDefault.put( "NetNodeAct", "gmu.drr.modelInst.simple.NetNodeActSimple" );
		// for the simple model case, each node has a single threshold [0..1], Poisson distributed 
		propsDefault.put( "NetNodeActThreshDist", "cern.jet.random.Beta" );
		propsDefault.put( "NetNodeActThreshParA", (new Double(12)).toString()  );
		propsDefault.put( "NetNodeActThreshParB", (new Double(8)).toString()  );
		// for the simple model case, each node has a self-excitation [0..1], Poisson distributed across all nodes
		propsDefault.put( "NetNodeActExcDist", "cern.jet.random.Beta" );
		propsDefault.put( "NetNodeActExcParA", (new Double(1)).toString() );
		propsDefault.put( "NetNodeActExcParB", (new Double(8)).toString() );
		// the excitation parameter is a meta-parameter - a mean for a recurring process within each node.  What distribution is that process?
		propsDefault.put( "NetNodeActExcSimDist", "cern.jet.random.Exponential" );
		// for the simple model case, each node has a self-suppression [0..1], Poisson distributed across all nodes 
		propsDefault.put( "NetNodeActSupDist", "cern.jet.random.Beta" );
		propsDefault.put( "NetNodeActSupParA", (new Double(2)).toString()  );
		propsDefault.put( "NetNodeActSupParB", (new Double(6)).toString()  );
		// the suppression parameter is a meta-parameter - a mean for a recurring process within each node.  What distribution is that process?
		propsDefault.put( "NetNodeActSupSimDist", "cern.jet.random.Exponential" );
		// DocGroupRel (relationship between documents and docGroups
		propsDefault.put( "UserGroupRel", "gmu.drr.modelInst.simple.UserGroupRelSimple" );
		// in the simple model case, each user-userGroup relationship has a weight [0..1], Poisson distributed
		propsDefault.put( "UserGroupRelWeightDist", "cern.jet.random.Beta" );
		propsDefault.put( "UserGroupRelWeightParA", (new Double(1)).toString() );
		propsDefault.put( "UserGroupRelWeightParB", (new Double(8)).toString() );

		knownDefaults = propsDefault;
		return propsDefault;
	}
	
	Properties origProps = null;
	public String modelName; //", "Default Model Name Parameter");
	public ModelModel model; //", "gmu.drr.modelInst.simple.ModelSimple" );
	public ModelFactory modelFactory; //", "gmu.drr.modelInst.simple.ModelFactorySimple" );
	public RandomEngine factoryRandomEngine; //", "cern.jet.random.engine.MersenneTwister" );
	public int factoryRandomSeed; //", (new Integer(factRandSeed)).toString() );
	
	public int numberUsers; //", (new Integer(400)).toString());
	public int numberUserGroups; //", (new Integer(8)).toString());
	
	public int numberDocs; //", (new Integer(400)).toString());
	public int numberDocGroups; //", (new Integer(8)).toString());
	
	// DocGroupRel (relationship between documents and docGroups
	public DocGroupRelModel docGroupRel; //", "gmu.drr.modelInst.simple.DocGroupRelSimple" );
	// in the simple model case, each doc-docGroup relationship has a weight [0..1], Beta distributed
	//public AbstractContinousDistribution docGroupRelWeightDist; //  = new cern.jet.random.Poisson(); ", "cern.jet.random.Poisson" );
	// the mean of the poisson distribution
	public double docGroupRelWeightParA; //", (new Double(0.1)).toString() );
	public double docGroupRelWeightParB; //", (new Double(0.1)).toString() );
	
//	public AbstractContinousDistribution userDegree;
	public double userDegreeWeight;
	public NetEdgeWeightModel netEdgeWeight; //", "gmu.drr.modelInst.simple.NetEdgeWeightSimple" );
	// for the simple model case, each edge has a single weight [0..1], Beta distributed 
	//public AbstractContinousDistribution netEdgeWeightDist; //", "cern.jet.random.Poisson" );
	// the mean of the poisson distribution
	public double netEdgeWeightParA; //", (new Double(0.2)).toString() );
	public double netEdgeWeightParB; //", (new Double(0.2)).toString() );
	
	public NetNodeActModel netNodeAct; //", "gmu.drr.modelInst.simple.NodeActSimple" );
	// for the simple model case, each node has a single threshold [0..1], Beta distributed 
	//public AbstractContinousDistribution netNodeActThreshDist; //", "cern.jet.random.Poisson" );
	// the mean of the poisson distribution
	public double netNodeActThreshParA; //", (new Double(0.6)).toString()  );
	public double netNodeActThreshParB; //", (new Double(0.6)).toString()  );
	// for the simple model case, each node has a self-excitation [0..1], Beta distributed across all nodes
	//public AbstractContinousDistribution netNodeActExcDist; //", "cern.jet.random.Poisson" );
	// the mean of the poisson distribution
	public double netNodeActExcParA; // ", (new Double(0.1)).toString() );
	public double netNodeActExcParB; // ", (new Double(0.1)).toString() );
	// the excitation parameter is a meta-parameter - a mean for a recurring process within each node.  What distribution is that process?
	//public AbstractContinousDistribution netNodeActExcSimDist; //", "cern.jet.random.Exponential" );

	// for the simple model case, each node has a self-suppression [0..1], Beta distributed across all nodes 
	//public AbstractContinousDistribution netNodeActSupDist;
	public double netNodeActSupParA; //", (new Double(0.25)).toString()  );
	public double netNodeActSupParB; //", (new Double(0.25)).toString()  );
	// the suppression parameter is a meta-parameter - a mean for a recurring process within each node.  What distribution is that process?
	//public AbstractContinousDistribution netNodeActSupSimDist; //", "cern.jet.random.Exponential" );
	// DocGroupRel (relationship between documents and docGroups
	public UserGroupRelModel userGroupRel; //", "gmu.drr.modelInst.simple.UserGroupRelSimple" );
	// in the simple model case, each user-userGroup relationship has a weight [0..1], Poisson distributed
	//public AbstractContinousDistribution userGroupRelWeightDist; //", "cern.jet.random.Poisson" );
	// the mean of the poisson distribution
	public double userGroupRelWeightParA; //", (new Double(0.1)).toString() );
	public double userGroupRelWeightParB; //", (new Double(0.1)).toString() );
	
}
